home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / linectrl.zip / LINECTRL.PAS < prev    next >
Pascal/Delphi Source File  |  1993-01-04  |  6KB  |  270 lines

  1. PROGRAM LineCtrl;
  2.  
  3. {$B-,D+,R-,S-,V-}
  4.  
  5. USES DOS, CRT;
  6.  
  7. CONST
  8.   Bell = #7;
  9.  
  10. TYPE
  11.   line = STRING[255];
  12.  
  13. VAR
  14.   Option      : integer;
  15.   LineRead    : line;
  16.   InFile      : TEXT;
  17.   OutFile     : TEXT;
  18.   InFileName  : line;
  19.   OutFileName : line;
  20.   Version     : line;
  21.   Buf1        : Array[1..16384] of Char;
  22.   Buf2        : Array[1..16384] of Char;
  23.  
  24. {
  25. ┌────────────────────────────────────────────────────┐
  26. │ PROCEDURE Error_Message                            │
  27. └────────────────────────────────────────────────────┘
  28. }
  29.  
  30. PROCEDURE Error_Message (message : string);
  31.  
  32. BEGIN
  33.   WRITELN (Bell,message);                      { ding bell & write message }
  34.   HALT;
  35. END;
  36.  
  37. {
  38. ┌────────────────────────────────────────────────────┐
  39. │ PROCEDURE Usage                                    │
  40. └────────────────────────────────────────────────────┘
  41. }
  42.  
  43. PROCEDURE Usage;
  44.  
  45. CONST
  46.   NL = #13#10;
  47.  
  48. BEGIN
  49.   WRITELN (Bell,
  50. 'A text file utility that removes consecutive blank lines exceeding a user',NL,
  51. 'definable number; default is 1 blank line at most.  ',NL,
  52. '',NL,
  53. 'USAGE:     LINECTRL [infile] [outfile] {/numlines}',NL,
  54. '',NL,
  55. '"numlines" is the maximum number of consecutive blank lines to keep in the',NL,
  56. 'text file.  0 is acceptable (i.e., no blank lines).',NL);
  57.  
  58.   Halt;
  59. END;
  60.  
  61. {
  62. ┌────────────────────────────────────────────────────┐
  63. │ PROCEDURE Read_Params                              │
  64. └────────────────────────────────────────────────────┘
  65. }
  66.  
  67. PROCEDURE Read_Params (VAR param_option : integer; VAR InFileNameV  : line;
  68.                                                    VAR OutFileNameV : line);
  69.  
  70. VAR
  71.   param : string;
  72.   code  : integer;
  73.  
  74. BEGIN
  75.   IF (ParamCount IN [2,3]) THEN
  76.     BEGIN
  77.       InFileNameV  := ParamStr(1);
  78.       OutFileNameV := ParamStr(2);
  79.       IF ParamStr(3) = '' THEN
  80.         BEGIN
  81.           param_option := 1;
  82.           EXIT;
  83.         END;
  84.                                              { implied ELSE routine        }
  85.       param        := ParamStr(3);           { check number of blank lines }
  86.       IF POS ('/',param) = 1 THEN            { to keep                     }
  87.         BEGIN
  88.           DELETE (param,1,1);
  89.           VAL (param, param_option, code);
  90.           IF code <> 0 THEN
  91.             Error_Message ('Error -- Input invalid');
  92.         END
  93.       ELSE
  94.         Error_Message ('Error -- Illegal parameter');
  95.     END
  96.   ELSE
  97.     Usage;
  98. END;
  99.  
  100. {
  101. ┌────────────────────────────────────────────────────┐
  102. │ PROCEDURE OPEN_INFILE                              │
  103. └────────────────────────────────────────────────────┘
  104. }
  105.  
  106. PROCEDURE Open_InFile (InFileNameV : line; VAR InFileV : TEXT);
  107.  
  108. VAR
  109.   FileAttr : word;
  110.  
  111. BEGIN
  112. {$I-}
  113.  
  114.   ASSIGN (InFileV,InFileNameV);
  115.   IF IOresult <> 0 THEN Error_Message ('Error -- cannot assign filename');
  116.  
  117.   GetFAttr (InFileV, FileAttr);
  118.   IF (FileAttr AND Directory) <> 0 THEN
  119.     Error_Message ('Error -- input file does not exist in current directory');
  120.  
  121.   RESET (InFileV);
  122.   IF IOresult <> 0 THEN Error_Message ('Error -- cannot open input file');
  123.  
  124.   SETTEXTBUF (InFileV, Buf1);
  125.  
  126. {$I+}
  127. END;
  128.  
  129. {
  130. ┌────────────────────────────────────────────────────┐
  131. │ PROCEDURE OPEN_OUTFILE                             │
  132. └────────────────────────────────────────────────────┘
  133. }
  134.  
  135. PROCEDURE Open_OutFile (OutFileNameV : line; VAR OutFileV : TEXT);
  136.  
  137. BEGIN
  138. {$I-}
  139.  
  140.   ASSIGN (OutFileV,OutFileNameV);
  141.   IF IOresult <> 0 THEN Error_Message ('Error -- cannot assign filename');
  142.  
  143.   REWRITE (OutFileV);
  144.   IF IOresult <> 0 THEN Error_Message ('Error -- cannot open output file');
  145.  
  146.   SETTEXTBUF (OutFileV, Buf2);
  147.  
  148. {$I+}
  149. END;
  150.  
  151. {
  152. ┌────────────────────────────────────────────────────┐
  153. │ PROCEDURE CLOSE_FILES                              │
  154. └────────────────────────────────────────────────────┘
  155. }
  156.  
  157. PROCEDURE Close_Files (VAR InFileV : TEXT; VAR OutFileV : TEXT);
  158.  
  159. BEGIN
  160.   CLOSE (InFileV);
  161.   CLOSE (OutFileV);
  162.   WRITELN (Bell);                               { ding bell }
  163. END;
  164.  
  165. {
  166. ┌────────────────────────────────────────────────────┐
  167. │ FUNCTION ALLSPACES                                 │
  168. └────────────────────────────────────────────────────┘
  169. }
  170.  
  171. FUNCTION Allspaces (str : LINE) : INTEGER;
  172.  
  173. VAR
  174.   i, cnt : INTEGER;
  175.  
  176. BEGIN
  177.   i   := 1;
  178.   cnt := LENGTH(str);
  179.   IF cnt = 0 THEN
  180.     Allspaces := 0
  181.   ELSE
  182.     BEGIN
  183.       WHILE (str[i] = ' ') AND (i <= cnt) DO
  184.         INC(i);
  185.       IF (i - 1) = cnt THEN
  186.         Allspaces := 1
  187.       ELSE
  188.        Allspaces := -1;
  189.     END;
  190. END;
  191.  
  192. {
  193. ┌────────────────────────────────────────────────────┐
  194. │ FUNCTION I_lesser                                  │
  195. └────────────────────────────────────────────────────┘
  196. }
  197.  
  198. FUNCTION I_lesser (a,b : LONGINT) : LONGINT;
  199.  
  200. BEGIN
  201.   IF a < b THEN
  202.     I_lesser := a
  203.   ELSE
  204.     I_lesser := b;
  205. END;
  206.  
  207. {
  208. ┌────────────────────────────────────────────────────┐
  209. │ PROCEDURE PROCESS_INFILE                           │
  210. └────────────────────────────────────────────────────┘
  211. }
  212.  
  213. PROCEDURE Process_InFile (NumLines : integer;
  214.                           VAR InFileV : TEXT; VAR OutFileV : TEXT);
  215.  
  216. VAR
  217.   Count    : integer;
  218.   i        : longint;
  219.  
  220. BEGIN
  221.   Count    := 0;
  222.  
  223.   WHILE NOT EOF (InFileV) DO
  224.     BEGIN
  225.       READLN (InFileV,LineRead);
  226.  
  227.       CASE ALLSPACES (LineRead) OF
  228.         -1:  BEGIN
  229.                IF Count > 0 THEN
  230.                  BEGIN
  231.                    FOR i:= 1 TO I_Lesser (Count, NumLines) DO
  232.                      WRITELN (OutFile);
  233.                    Count := 0;
  234.                  END;
  235.                WRITELN (OutFileV, LineRead);
  236.              END;
  237.         0,1: INC (Count);
  238.       END; {case}
  239.  
  240.     END; { while#1 }
  241.  
  242.   FLUSH (OutFileV);                            { ensure all lines written }
  243. END;
  244.  
  245. {
  246. ┌────────────────────────────────────────────────────┐
  247. │ MAIN PROGRAM                                       │
  248. └────────────────────────────────────────────────────┘
  249. }
  250.  
  251. BEGIN
  252.  
  253.   Version := 'Version 1.1, 6-29-88 -- Public Domain by John Land';
  254.  
  255.   CLRSCR;
  256.  
  257.   Read_Params (Option, InFileName, OutFileName);
  258.  
  259.   Open_InFile (InFileName, InFile);
  260.  
  261.   Open_OutFile (OutFileName, OutFile);
  262.  
  263.   WRITELN ('PROCESSING ',InFileName, ' INTO ', OutFileName);
  264.  
  265.   Process_InFile (Option, InFile, OutFile);
  266.  
  267.   Close_Files (InFile, OutFile);
  268.  
  269. END.
  270.